package com.gaofei.pdf.controller;

import cn.hutool.bloomfilter.BitMapBloomFilter;
import com.gaofei.pdf.domain.House;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

@RestController
public class TestRedisController {

    @Autowired
    private RedisTemplate redisTemplate;

    @RequestMapping("redis")
    public Object redis(String userKey){

        House house1 = new House();
        house1.setId(1);
        house1.setAddress("北京市");
        house1.setCommunity("环境优美");

        House house2 = new House();
        house2.setId(2);
        house2.setAddress("天津");
        house2.setCommunity("环境优美");


        //使用redis做缓存的步骤
        //2.实现列表功能,第一次使用数据库获取数据,然后存入redis,1.后面再次获取列表的时候,先判断redis是否存在,存在就直接使用redis数据,不存在再访问数据库

        //0.在这里,写个过滤器,过滤掉没用的请求,只保留有用的请求
        //没用的请求:请求中没有redis的key的都是没用的
        //  a.把redis'中有用的key在布隆过滤器中初始化     1
        //  b.
        BitMapBloomFilter bitMapBloomFilter = new BitMapBloomFilter(100);
        bitMapBloomFilter.add("housesList");
        bitMapBloomFilter.add("housesList1");
        bitMapBloomFilter.add("housesList2");
       /* Set keys = redisTemplate.keys("*");
        keys.forEach(key->{
            bitMapBloomFilter.add(key+"");
        });
*/
        if (bitMapBloomFilter.contains(userKey)){
            //1.先冲redis中获取数据
            List<House> housesListRedis = redisTemplate.opsForList().range(userKey, 0, -1);

            if (housesListRedis != null && housesListRedis.size() > 0) {
                //2.如果redis中有数据,就直接返回,如果没有数据
                System.out.println("查询了redis");
                return housesListRedis;
            }
            //3.从数据库查询,存入redis一份
            List<House> listDB = Arrays.asList(house1, house2);//模拟数据查询的数据
            redisTemplate.opsForList().leftPushAll(userKey,listDB);
            System.out.println("查询了数据库");
            return listDB;
        }
        return "穿透了";



    }
}
